package algo;
/**
* Classe controlant les differentes etapes du didacticiel de tri rapide
* @author Kevin Georgy
* @since 13.06.2007	
* @version 1.0
*/

public class QuickSort {
   
	/**
	* Etat du tri
	*/	
	private QuickSortState state;
   
	/**
	* Etapes
	*/
	private Steps steps;
	
	/**
	* Prochaine etape a appliquer
  	*/
	private Step nextStep;
	
	/**
	* Construit le controler de tri rapide
	*/
	public QuickSort() {
		steps = new Steps(this);
		state = new QuickSortState(this);
		state.lastStep = steps.start();
	}
	
	/**
	* Retourne les differentes etapes de tri
	* @return Etapes de tri
	*/
	Steps steps() {
		return steps;
	}
	
	/**
	* Retourne l'etat du tri
	* @return Etat du tri
	*/
	public QuickSortState state() {
		return state;
	}
   
	/**
	* Applique l'etape suivante du tri
	*/
	public void nextStep() {
		state.lastStep = nextStep;
		nextStep = nextStep.apply();
		state.change();
	}
   
	/**
	* Demarre le didacticiel
	*/
	public void start() {
		state.started = true;
		nextStep = steps.start();
		nextStep();
		state.change();
	}

	/**
	* Stop le didacticiel de tri
	*/
	public void stop() {
		state.started = false;
		state.init();
		state.change();
	}
   
	/**
	* Supprime un element du tableau a trier
	* @param element Element a supprimer
	* @return Vrai si l'element est supprimer sinon faux
	* @exception StartedException Si tri est en cours
	*/
	public boolean remove(Comparable element) 
		throws StartedException 
	{
		if (state.started)
			throw new StartedException();
		if (state.array.remove(element)) {
			state.current.getContent().end = state.array.size()-1;
			state.change();
			return true;
		}
		return false;
	}
   
	/**
	* Ajoute un element du tableau a trier
	* @param element Element a ajouter
	* @exception StartedException Si tri est en cours
	*/
	public void add(Comparable element) 
		throws StartedException 
	{
		if (state.started)
			throw new StartedException();
		state.array.add(element);
		state.current.getContent().end = state.array.size()-1;
		state.change();
	}

	/**
	* Supprime tous les elements du tableau a trier
	* @exception StartedException Si tri est en cours
	*/
	public void clear() throws StartedException 
	{
		if (state.started)
			throw new StartedException();
		state.array.clear();
		state.current.getContent().end = state.array.size()-1;
		state.change();
	}
}
